# Copyright (c) Alibaba, Inc. and its affiliates.
import os
from typing import List, Union


def to_abspath(path: Union[str, List[str], None], check_path_exist: bool = False) -> Union[str, List[str], None]:
    """
    检查路径有效性并转换为绝对路径。

    参数:
        path: 单个路径字符串、路径字符串列表，或 None
        check_path_exist: 是否检查路径是否存在（默认 False）

    返回:
        绝对路径（str 或 str 列表），如果输入是 None，则返回 None
    """

    # 如果 path 为 None，直接返回
    if path is None:
        return

    # 如果 path 是字符串类型（单个路径）
    elif isinstance(path, str):
        # 将用户目录符号 ~ 展开，并转换为绝对路径
        path = os.path.abspath(os.path.expanduser(path))

        # 如果设置了检查路径存在性且路径不存在，则抛出异常
        if check_path_exist and not os.path.exists(path):
            raise FileNotFoundError(f"path: '{path}'")

        # 返回处理后的路径
        return path

    # 如果 path 是列表，递归处理每个路径
    assert isinstance(path, list), f'path: {path}'  # 确保类型为 list，否则抛出断言错误
    res = []
    for v in path:
        # 对列表中的每个路径递归调用 to_abspath
        res.append(to_abspath(v, check_path_exist))

    return res  # 返回处理后的路径列表
